컴파일러는 위의 코드에서 processWidget 호출 코드를 생성하기 전에
함수의 매개변수로 넘겨지는 인자를 평가(evaluate)한다.
첫 번째 인자 std::shared_ptr<Widget>(new Widget)은 두 부분으로 이루어져 있다.
- new Widget 표현식 실행
- std::shared_ptr 생성자 호출
두 번째 인자 priority()는 아래의 하나의 부분으로 이루어져 있다.
- priority 함수 호출
위의 3가지 연산이 실행되는 순서는 컴파일러에 따라 다르다.
C++ 컴파일러는 연산의 순서를 정하는데 자유롭다.(Java, C#의 경우, 컴파일러와 별개로 평가 순서가 고정되어 있음)
만일 newWidget 연산이 실행되어 동적 메모리가 할당된 이후, shared_ptr 생성자를 호출하기 전에
예외가 발생한 경우(priority에서 예외가 발생한 경우) 포인터가 유실될 수 있다.
이와 같은 문제를 피하기 위해,
Widget을 생성해 스마트 포인터에 저장하는 코드를 별도의 문장으로 생성하고,
해당 스마트 포인터를 processWidget으로 넘기는 것이 좋다.